package lessons.no6;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

/**
 * 工具类  Collections Arrays
 */
public class N6_8 {
    
    public static void main(String[] args) {
        N6_8 myclass = new N6_8();
        //myclass.testCollections();
        //myclass.testCollections2();
        //myclass.testArrays();
        myclass.testArrays2();
        myclass.testArrays3();
        myclass.testArrays4();

		//myclass.testSort();
    }

	public void testSort()
	{
		ArrayList<Integer> list = new ArrayList<>();
		list.add(9);
		list.add(4);
		list.add(3);
		list.add(7);
		list.add(1);

		System.out.println("排序前: " + list);          // 输出排序前的集合

		Collections.sort(list,new MyComparator()); 

		System.out.println("按MyComparator排序后: " + list);
	}

	class MyComparator implements Comparator
	{

		@Override
		public int compare(Object arg0, Object arg1) {
			// TODO Auto-generated method stub
			return (Integer)arg1-(Integer)arg0;
		}
		
	}
    public void testCollections()
    {
        ArrayList<String> list = new ArrayList<>();
		Collections.addAll(list, "C","Z","B","K");    // 添加元素
		System.out.println("排序前: " + list);          // 输出排序前的集合
		Collections.reverse(list);                    // 反转集合
		System.out.println("反转后： " + list); 
		Collections.sort(list);                       // 按自然顺序排列
		System.out.println("按自然顺序排序后: " + list);
		Collections.shuffle(list);                    // 随机打乱集合元素
		System.out.println("按随机顺序排序后: " + list); 
		Collections.swap(list, 0, list.size()-1);     // 将集合首尾元素交换
		System.out.println("集合首尾元素交换后: " + list); 
    }

    public void testCollections2()
    {
        ArrayList<Integer> list = new ArrayList<>();
		Collections.addAll(list, -3,2,9,5,8);  // 向集合中添加所有指定元素
		System.out.println("集合中的元素: " + list);
		System.out.println("集合中的最大元素: " + Collections.max(list));
		System.out.println("集合中的最小元素: " + Collections.min(list));
		Collections.replaceAll(list, 8, 0);   // 将集合中的8用0替换掉
		System.out.println("替换后的集合: " + list);
		Collections.sort(list);               //使用二分查找前，必须保证元素有序
		System.out.println("集合排序后为： "+list);
		int index = Collections.binarySearch(list, 9);
		System.out.println("集合通过二分查找方法查找元素9所在角标为："+index);
    }

    public void testArrays()
    {
        int[] arr = { 9, 8, 3, 5, 2 }; 			// 初始化一个数组
		System.out.print("排序前：");
		printArray(arr); 						// 打印原数组
		Arrays.sort(arr); 						// 调用Arrays的sort()方法排序
		System.out.print("排序后：");
		printArray(arr);
    }
    // 定义打印数组元素方法
	private void printArray(int[] arr) { 
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x != arr.length - 1) {
				System.out.print(arr[x] + ", ");
			} else {
				System.out.println(arr[x] + "]");
			}
		}
	}

    public void testArrays2()
    {
        int[] arr = { 9, 8, 3, 5, 2 };
		Arrays.sort(arr);							// 调用排序方法，对数组排序
		int index = Arrays.binarySearch(arr, 3);	// 查找指定元素3
		System.out.println("元素3的索引是:" + index);	// 输出打印元素所在的索引位置
    }

    public void testArrays3()
    {
        int[] arr = { 9, 8, 3, 5, 2 };
		// 赋值一份指定范围的数组
		int[] copied = Arrays.copyOfRange(arr, 1, 7);
		for (int i = 0; i < copied.length; i++) {
			System.out.print(copied[i] + " ");
		}
    }

    public void testArrays4()
    {
        int[] arr = { 1, 2, 3, 4 };
		Arrays.fill(arr, 8); // 用8替换数组中的每一个值
		for (int i = 0; i < arr.length; i++) {
			System.out.println(i + ": " + arr[i]);
		}
    }
}
